#pragma once
#include "umtl/enum_t/enum_t.hpp"
#include "../common/tcp_base_common_type.h"

//////////////////////////////////////////////////////////////////////////
//

#define __declare_id_enum_element_( r, data, t ) t,
#define __declare_protocol_type_element_(r, data, t) \
	template<> struct get_protocol_t< send_packet_id_e::##data > { typedef send_protocol::##data type; };
#define __declare_protocol_id_element_(r, data, t) \
	template<> struct get_protocol_id< send_protocol::##data > { static send_packet_id_e::eID const _id = send_packet_id_e::##data ; };

//////////////////////////////////////////////////////////////////////////
//

#define __declare_send_protocol_( enum_args ) \
	enum_t( send_packet_id_e, enum_args ) \
	namespace send_protocol \
	{ \
		template<send_packet_id_e::eID>\
		struct get_protocol_t { typedef send_protocol::max type; }; \
		template<typename protocol_t> \
		struct get_protocol_id { static packet_id_t const _id = send_packet_id_e::max; }; \
		BOOST_PP_SEQ_FOR_EACH(__declare_protocol_type_element_, ~, enum_args) \
		BOOST_PP_SEQ_FOR_EACH(__declare_protocol_id_element_, ~, enum_args) \
	}

//
//#undef __declare_send_protocol_
//#undef __declare_protocol_id_element_
//#undef __declare_protocol_id_element_
//#undef __declare_id_enum_element_

///////////////////////////////////////////////////////////////////////////////////